﻿using System;
using System.Collections.Generic;

namespace Mx.Ipn.Escom.TT20080015.Modelo.Codificacion
{
    class Codificacion
    {
        //Jhonson Möebius
        public static string convertirJM1(int valor, int longitud)
        {
            string tramaJM = "";
            for (int a = 0; a < longitud; a++)
            {
                if (a < valor)
                    tramaJM += 1;
                else
                    tramaJM += 0;
            }
            return tramaJM;
        }
        public static string convertirJM0(int valor, int longitud)
        {
            string tramaJM = "";
            for (int a = longitud; a > 0; a--)
            {
                if (a >= valor)
                    tramaJM += 0;
                else
                    tramaJM += 1;
            }
            return tramaJM;
        }

	    /**
	    * This Method converts from natural binary codes to binary-reflected Gray (code).
	    * @param b The natural binary code.
	    * @return binary-reflected Gray code value.
	    */
	    public static int decToGrayCode(int b){
		    return ( b ^ (b >> 1) );
	    }

	    public static int grayCodeToDec(int n) {
            int ish, ans, idiv;
            ish = 1;
            ans = n;
            while(true) {
                    idiv = ans >> ish;
                    ans ^= idiv;
                    if (idiv <= 1 || ish == 32) 
                            return ans;
                    ish <<= 1; // double number of shifts next time
            }
        }

	    /** 
	    * Convert a value to a graycode with the given base and digits. Iterating
	    * through a sequence of values would result in a sequence of graycodes in
	    * which only one digit changes at a time.
	    *
	    * @param value The value to be coded.
	    * @param base The base of the n-ary gray code.
	    * @param digits The digits to be considered.
	    * @return n-ary gray code value.
	    */
        public static int[] decToNAryGrayCode(int value, int baseCod, int digits)
        {
		    int []baseN = new int[digits];     // Stores the ordinary base-N number, one digit per array entry.
		    int []gray = new int[digits];      // Stores the base-N graycode number.
     
		    // Put the normal baseN number into the baseN array. For base 10, 109 
		    // would be stored as [9,0,1]
		    for(int i = 0; i < digits; i++) {
                baseN[i] = value / (int)Math.Pow(baseCod, i) % baseCod;
		    }
     
		    // Convert the normal baseN number into the graycode equivalent. Note that
		    // the loop starts at the most significant digit and goes down.
		    int shift = 0;
		    for(int i = digits; i >= 0; --i) {
			    // The gray digit gets shifted down equal to the sum of the higher
			    // digits.
			    gray[i] = (baseN[i] - shift) % baseCod;
     
			    shift += gray[i];
		    }
		    // EXAMPLES
		    // input: value = 1899, base = 10, digits = 4
		    // output: baseN[] = [9,9,8,1], gray[] = [0,1,7,1]
		    // input: value = 1900, base = 10, digits = 4
		    // output: baseN[] = [0,0,9,1], gray[] = [0,1,8,1]
		    return gray;
	    }

	    public static int decToBalancedGraycode(){
		    return 0;
	    }

	    public static int decToBeckettGrayCode(){
		    return 0;
	    }

	    public static int decToSnakeInTheBoxCodes(){
		    return 0;
	    }

	    public static int decToSingleTrackGrayCode(){
		    return 0;
	    }

	    /**
	    * Este m&eacute;todo regresa una cadena que representa el valor del par&aacute;metro g,
	    * como n&uacute;mero binario.
	    *
	    * @param g Es el n&uacute;mero de tipo entero del cual se va a obtener su 
	    *			representaci&oacute;n en binario como cadena.
	    * @return str Es una cadena que representa el nœmero g de tipo entero, en 
	    * binario
	    */
	    public static string toString(int g){
		    string str = "";
		    while( g != 0 ){
			    str = ( (g & 1) == 1 ) ? "1" + str : "0" + str;
			    g >>= 1;
		    }
		    return str;
	    }

	    /**
	    * Este m&eacute;todo regresa una cadena que representa el valor del par&aacute;metro g,
	    * como n&uacute;mero binario de n bits.
	    *
	    * @param g Es el n&uacute;mero de tipo entero del cual se va a obtener su 
	    *			representaci&oacute;n en binario como cadena.
	    * @param n Es el n&uacute;mero de bits que se van a considerar para el valor de retorno.
	    * @return str Es una cadena que representa el nœmero g de tipo entero, en binario
	    */
	    public static string toString(int g, int n){
		    string str = "";
		    for(int i=0; i<n; i++){
			    str = ( (g & 1) == 1 ) ? "1" + str : "0" + str;
			    g >>= 1;
		    }
		    return str;
	    }
    }
}
